package com.gitee.feizns.dynamic.function;

import java.util.function.Consumer;
import java.util.function.Function;

/**
 * 子函数
 * @author feizns
 * @since 2023/05/02
 */
public class ChildrenFunction<T> {

    /**
     * 函数参数
     */
    private final T parameter;

    /**
     * 函数参数
     * @return 函数参数
     */
    public T getParameter() {
        return parameter;
    }

    public ChildrenFunction(T parameter) {
        this.parameter = parameter;
    }

    /**
     * 应用参数与某个{@link Function}函数
     * @param func 函数
     * @return {@link R}
     */
    public <R> R apply(Function<T, R> func) {
        return func.apply(parameter);
    }

    /**
     * 应用参数与某个{@link Consumer}函数
     * @param consumer 消费者
     */
    public void apply(Consumer<T> consumer) {
        consumer.accept(getParameter());
    }

    /**
     * 将原参数进行映射
     * @param mapper 函数
     * @return {@link R}
     */
    public <R> ChildrenFunction<R> map(Function<T, R> mapper) {
        return new ChildrenFunction<R>(apply(mapper));
    }

}
